<?php
defined('IN_CMS') or die('Direct access to Script restricted.');

class Page extends Common
{
	private $page_id;
	private $current_page;
	
	/**
	 * Конструктор класса
	 */
	public function __construct($init_page = true)
	{
		if ($init_page)
		{
			$this->page_id = 0;
			$this->current_page = null;
		
			// Определяем какую страницу показывать
			$this->initCurrentPage();

			// Шаблон всей страницы (master_page)
			define('TPL_MASTER_PAGE', 'pages/' . $this->current_page['master_page'] . '.tpl');

			// Шаблон контента страницы (template)
			define('TPL_PAGE', 'pages/' . $this->current_page['template'] . '.tpl');
		}
	}

	/**
	 * Деструктор класса
	 */
	public function __destruct()
	{

	}

	/**
	 * Определяем какая страница была выбрана,
	 * сохраняем информацию о выбранной странице в массив "$this->current_page"
	 *
	 * @return	void
	 */
	public function initCurrentPage()
	{
		// Получим массив параметров адресной строки
		$request = self::$obj_request->getParam();
		$page_id = false;

		if (count($request) > 0)
		{
			// В адресной строке были переданы параметры
			// Ищем страницу, "page_url" которой возможно содержится в адресной строке
			$page_url = '';
			$sql_where = '';
			$cnt = count($request);
			for ($i=0; $i<$cnt; $i++)
			{
				$page_url .= $request[$i] . '/';
				if ($sql_where != '') { $sql_where .= " OR "; }
				$sql_where .= "page_url = " . self::$obj_functions->toMySQL($page_url, true);
			}
			$sql = "SELECT page_id FROM " . TABLE_PREFIX . "pages WHERE " . $sql_where . " ORDER BY page_url DESC LIMIT 1";
		}
		else
		{
			// В адресной строке нет параметров, покажем страницу по умолчанию
			$sql = "SELECT page_id FROM " . TABLE_PREFIX . "pages WHERE is_default = 1 LIMIT 1";
		}

		//self::$obj_error->showMessage($sql, 3);
		$result = self::$obj_db->sql_query($sql) or self::$obj_error->showMessageSQL(__FUNCTION__, basename(__FILE__), __LINE__);
		if ( self::$obj_db->sql_numrows($result) > 0 )
		{
			$row = self::$obj_db->sql_fetchrow($result);
			$page_id = (int)$row['page_id'];
		}

		if ($page_id === false)
		{
			// Запрашиваемая страница не найдена,
			// покажем страницу 404
			$sql = "SELECT page_id FROM " . TABLE_PREFIX . "pages WHERE code = '404' LIMIT 1";

			//self::$obj_error->showMessage($sql, 3);
			$result = self::$obj_db->sql_query($sql) or self::$obj_error->showMessageSQL(__FUNCTION__, basename(__FILE__), __LINE__);
			if ( self::$obj_db->sql_numrows($result) > 0 )
			{
				$row = self::$obj_db->sql_fetchrow($result);
				$page_id = (int)$row['page_id'];
			}
		}
		self::$obj_db->sql_freeresult($result);

		$this->page_id = $page_id;

		// Получим полную информацию о запрашиваемой странице
		// В данном случае внутри функции будет записана информация в массив "$this->current_page",
		// поэтому нас не интересует возвращаемый функцией массив
		$this->getPageByID($page_id);

		unset($request, $page_url, $sql_where, $sql, $result, $row, $cnt, $i, $page_id);
	}
	
	/**
	 * Сохраняем контент страницы
	 * 
	 * @param	int		$page_id
	 * @param	int		$lang_id
	 * @param	string	$page_content 
	 */
	public function savePageContent($page_id, $lang_id, $page_content)
	{
		//
		$sql = "UPDATE 
					" . TABLE_PREFIX . "pages_lang 
				SET 
					page_content = " . self::$obj_functions->toMySQL($page_content, true) . " 
				WHERE 
					page_id = " . (int)$page_id . " 
					AND 
					lang_id = " . (int)$lang_id . " 
				LIMIT 1";
		
		//self::$obj_error->showMessage($sql, 3);
		$result = self::$obj_db->sql_query($sql) or self::$obj_error->showMessageSQL(__FUNCTION__, basename(__FILE__), __LINE__, true);
				
		unset($page_id, $lang_id, $page_content, $result);
	}

	/**
	 * Возвращает "page_url" выбранной страницы
	 *
	 * @return	string
	 */
	public function getCurrentPageURL()
	{
		return $this->current_page['page_url'];
	}

	/**
	 * Возвращает "code" выбранной страницы
	 *
	 * @return	string
	 */
	public function getCurrentPageCode()
	{
		return $this->current_page['code'];
	}

	/**
	 * Возвращает ID выбранной страницы
	 *
	 * @return	int		$page_id
	 */
	public function getCurrentPageID()
	{
		return $this->page_id;
	}

	/**
	 * Возвращает массив с информацией о странице с указанным ID
	 *
	 * @return	array
	 */
	public function getPageByID($page_id)
	{
		if ($this->page_id == $page_id && count($this->current_page) > 0)
		{
			// Если ранее мы уже запрашивали информацию о этой странице,
			// то нет смысла еще раз делать запрос к БД, возьмем информацию из массива "$this->current_page"
			return $this->current_page;
		}

		$page = array();
		
		//
		$sql = "SELECT 
					p.page_id,
					p.parent_id,
					p.code,
					p.page_url,
					p.is_default,
					p.master_page,
					p.template,
					pl.meta_title,
					pl.meta_description,
					pl.meta_keywords,
					pl.page_name,
					pl.page_intro,
					pl.page_content
				FROM 
					" . TABLE_PREFIX . "pages AS p
				LEFT JOIN
					" . TABLE_PREFIX . "pages_lang AS pl
				ON
					p.page_id = pl.page_id
					AND
					pl.lang_id = " . LANG_ID . " 
				WHERE 
					p.page_id = " . (int)$page_id . "
					AND
					pl.is_active = 1 
				LIMIT 1";

		//self::$obj_error->showMessage($sql, 3);
		$result = self::$obj_db->sql_query($sql) or self::$obj_error->showMessageSQL(__FUNCTION__, basename(__FILE__), __LINE__);
		if ( self::$obj_db->sql_numrows($result) > 0 )
		{
			$row = self::$obj_db->sql_fetchrow($result);
			
			$page['page_id'] = (int)$row['page_id'];
			$page['parent_id'] = (int)$row['parent_id'];
			$page['code'] = self::$obj_functions->toHTML($row['code']);
			$page['page_url'] = self::$obj_functions->toHTML($row['page_url']);
			$page['is_default'] = (int)$row['is_default'];
			$page['master_page'] = self::$obj_functions->toHTML($row['master_page']);
			$page['template'] = self::$obj_functions->toHTML($row['template']);
			$page['meta_title'] = self::$obj_functions->toHTML($row['meta_title']);
			$page['meta_description'] = self::$obj_functions->toHTML($row['meta_description']);
			$page['meta_keywords'] = self::$obj_functions->toHTML($row['meta_keywords']);
			$page['page_name'] = self::$obj_functions->toHTML($row['page_name']);
			$page['page_intro'] = $row['page_intro'];
			$page['page_content'] = $row['page_content'];
		}

		$this->current_page = $page;

		self::$obj_db->sql_freeresult($result);
		unset($sql, $result, $row, $page_id, $page);

		return $this->current_page;
	}

	/**
	 * Установим контент страницы
	 * 
	 */
	public function setPageContent()
	{
		// Подключаем скрипт для обработки шаблона MasterPage страницы
		$file = ABSPATH . 'includes/' . str_replace('.tpl', '.php', TPL_MASTER_PAGE);
		if (is_file($file))
		{
			require_once($file);

			// Определим шаблон для контента страницы
			self::$obj_template->assign_file('TPL_PAGE_CONTENT', TPL_PAGE);

			// Подключаем скрипт для обработки шаблона страницы (поле "template")
			$file = ABSPATH . 'includes/' . str_replace('.tpl', '.php', TPL_PAGE);
			if (is_file($file))
			{
				require_once($file);
			}
		}

		// Контент страницы
		self::$obj_template->assign('page_name', $this->current_page['page_name']);
		self::$obj_template->assign('page_intro', $this->current_page['page_intro']);
		self::$obj_template->assign('page_content', $this->current_page['page_content']);

		// META тэги для страницы
		//define('META_TITLE', $this->current_page['meta_title']);
		//define('META_DESCRIPTION', $this->current_page['meta_description']);
		//define('META_KEYWORDS', $this->current_page['meta_keywords']);
	}
	
	/**
	 *  getPageContent()
	 * 
	 */
	public function getPageContent()
	{
		return $this->current_page['page_content'];
	}
	
	/**
	 * setPageMeta()
	 * 
	 */
	public function setPageMeta()
	{
		// Мета-теги для страницы
		self::$obj_template->assign('META_TITLE', $this->current_page['meta_title']);
		self::$obj_template->assign('META_DESCRIPTION', $this->current_page['meta_description']);
		self::$obj_template->assign('META_KEYWORDS', $this->current_page['meta_keywords']);
	}

	/**
	 *
	 * @param	string	$text
	 */
	public function setPageMetaTitle($text)
	{
		$this->current_page['meta_title'] = $text;
	}

	/**
	 * @return	string
	 */
	public function getPageMetaTitle()
	{
		return $this->current_page['meta_title'];
	}

	/**
	 *
	 * @param	string	$text
	 */
	public function setPageMetaDescription($text)
	{
		$this->current_page['meta_description'] = $text;
	}

	/**
	 * @return	string
	 */
	public function getPageMetaDescription()
	{
		return $this->current_page['meta_description'];
	}

	/**
	 *
	 * @param	string	$text
	 */
	public function setPageMetaKeywords($text)
	{
		$this->current_page['meta_keywords'] = $text;
	}

	/**
	 * @return	string
	 */
	public function getPageMetaKeywords()
	{
		return $this->current_page['meta_keywords'];
	}

	/**
	 * Обработка контрола
	 *
	 * @param	string	$name				Название контрола
	 * @param	string	$path				Путь к блоку с контролом (например "main.tpl_page_content")
	 * @param	int		$cache_expiry		Максимальный «возраст» файла в секундах
	 * @param	array	$parameters			
	 * @return	void
	 */
	public function showControl($name, $path, $cache_expiry, $parameters = null)
	{
		// Если путь к блоку не указан, используем размещение по умолчанию
		// (внутри блока с контентом страницы)
		if ($path == '')
		{
			$path = 'main.tpl_page_content';
		}
		// Путь к скрипту для обработки контрола
		$file = ABSPATH . 'includes/controls/' . $name . '.php';

		//
		if ($cache_expiry > 0)
		{
			// Использовать кэширование
			$header = self::$obj_functions->readCache('control.' . $name . '.cache', $cache_expiry);
			if (!$header)
			{
				// Файл кэша не найден или он не актуален... парсим контрол
				self::$obj_template->assign_file('CONTROL_' . strtoupper($name), 'controls/' . $name . '.tpl');
				require_once $file;
				self::$obj_template->parse($path . '.control_' . $name);
				// Создаем файл кэша (контент берем из пропарсенного контрола)
				self::$obj_functions->writeCache(self::$obj_template->text($path . '.control_' . $name), 'control.' . $name . '.cache');
			}
			else
			{
				// Файл кэша найден и он актуален
				// Контент берем из кэша, нет необходимости парсить контрол
				self::$obj_template->assign_file('CONTROL_' . strtoupper($name), 'cache/control.' . $name . '.cache');
				self::$obj_template->parse($path . '.control_' . $name);
			}
		}
		else
		{
			// Не использовать кэширование
			self::$obj_template->assign_file('CONTROL_' . strtoupper($name), 'controls/' . $name . '.tpl');
			require_once $file;
			self::$obj_template->parse($path . '.control_' . $name);
		}
	}


	

}
?>